package kr.co.dayve.site.management.controller;


import kr.co.dayve.site.domain.*;
import kr.co.dayve.site.management.service.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.*;

/**
 * 마이페이지 컨트롤러 그래프를 생성할 자료를 DB에서 가져와
 * List 형태로 JSP 페이지에 넘겨준다.
 */
public class MyPageController extends MultiActionController {

    // SLF4J Logging
    private Logger logger = LoggerFactory.getLogger(MyPageController.class);

    /**
     * Community Board Method
     */


    public ModelAndView myPage(HttpServletRequest request, HttpServletResponse response)  throws Exception {

        HttpSession session = request.getSession(false);

        if(session == null){
            return new ModelAndView("index");
        }


        String user_id = (String)session.getAttribute("userId");
        int totalFavorite = 0;

        if(user_id == null){
            return new ModelAndView("index");
        }

        Category category = new Category();
        Member member = new Member();
                

        category.setActivate_yn("y");
        category.setMembers_id(user_id);

        java.util.List categoryList = myPageService.getCategoryListByMembersId(category);
        String totalCount = myPageService.getTotalCategoryCountByMembersId(category);
        String totalItemCount = myPageService.getTotalItemByMembersId(user_id);

        member = dayveService.getMemberById(user_id);

//        logger.info("myPage");
//        logger.info("id        : {}", user_id);
//        logger.info("totalCount: {}", totalCount);
        for(int i = 0; i < categoryList.size(); i++){
            category = (Category)categoryList.get(i);
//            logger.info("category  : {}", category.getName());
//            logger.info("comment   : {}", category.getComment());
//            logger.info("categoryId: {}", category.getId_myhistory_categories());
//            logger.info("favoriteYN: {}", category.getFavorite_yn());
            if(category.getFavorite_yn().equals("Y")) totalFavorite++;
        }

//        logger.info("totalItem : {}", totalItemCount);
//        logger.info("totalFavor: {}", totalFavorite);

        ModelAndView mav = new ModelAndView();

        mav.setViewName("myPage");

        mav.addObject("categoryList", categoryList);
        mav.addObject("totalCount", Integer.parseInt(totalCount));
        mav.addObject("totalItemCount", totalItemCount);
        mav.addObject("totalFavorite", totalFavorite);
        mav.addObject("mileage", member.getMileage());

        return mav;
    }

    public ModelAndView myPageContent(HttpServletRequest request, HttpServletResponse response)  throws Exception {

        HttpSession session = request.getSession(false);

        if(session == null){
            return new ModelAndView("index");
        }


        Category category = new Category();
        Category tempCategory = new Category();
        Category NameCategory = new Category();

        Member member = new Member();

        /**
         * 세션으로부터 ID를 받아온다 userId id_myhistory_categories
         * form 으로 부터 받아온 카테고리 명
         */
        String user_id = (String)session.getAttribute("userId");
        String category_id = request.getParameter("id_myhistory_categories");
        int totalFavorite = 0;

        if(user_id == null){
            return new ModelAndView("index");
        }


        /**
         * setActivate_yn = y 인 것들만 받아온다.
         * 검색어로 user_id 셋팅
         */
        category.setActivate_yn("y");
        category.setMembers_id(user_id);

        /**
         * 화면 좌측에 뿌려줄 해당 사용자의 카테고리 목록을 받아온다.
         * 목록에 뿌려주기 위한 카테고리 목록의 사이즈를 가져온다.
         * 해당 카테고리에 속한 모든 아이템의 수를 받아온다.
         */
        java.util.List categoryList = myPageService.getCategoryListByMembersId(category);
        String totalCount = myPageService.getTotalCategoryCountByMembersId(category);
        String totalItemCount = myPageService.getTotalItemByMembersId(user_id);
        member = dayveService.getMemberById(user_id);


        /**
         * 아이템 리스트를 가져오기 위한 임시 도메인셋팅
         * setActivate_yn = y 인 것들만 받아온다.
         * 검색어로 user_id 셋팅
         * 어떤 카테고리의 아이템을 가져올지 셋팅 category_id
         */
        tempCategory.setActivate_yn("y");
        tempCategory.setMembers_id(user_id);
        tempCategory.setId_myhistory_categories(category_id);

        /**
         * tempCategory 를 이용해 해당 카테고리의 아이템 리스트를 가져온다.
         * 선택한 카테고리의 아이디를 이용해 카테고리를 받아온다.
         */
        java.util.List itemList = myPageService.getItemListByCategory(tempCategory);
        NameCategory = myPageService.getCategoryByCategoryId(category_id);

        /**
         * 해당 카테고리의 내역 (꺽은선 그래프) 를 그리기 위해 itemEventList 를 받아온다.
         */
        java.util.List itemEventList = myPageService.getItemEventByCategory(tempCategory);

        int itemCount = itemList.size();
        int itemEventCount = itemEventList.size();






//        logger.info("myPageContent");
//        logger.info("id        : {}", user_id);
//        logger.info("totalCount: {}", totalCount);
        /**
         * 즐겨찾기 계산
         */
        for(int i = 0; i < categoryList.size(); i++){
            category = (Category)categoryList.get(i);
//            logger.info("category  : {}", category.getName());
//            logger.info("comment   : {}", category.getComment());
//            logger.info("categoryId: {}", category.getId_myhistory_categories());
//            logger.info("favoriteYN: {}", category.getFavorite_yn());
            if(category.getFavorite_yn().equals("Y")) totalFavorite++;
        }

//        logger.info("totalItem : {}", totalItemCount);
//        logger.info("totalFavor: {}", totalFavorite);
//        logger.info("totalItemE: {}", itemEventCount);

        ItemEvent tempItemEvent = new ItemEvent();
        java.util.List tempItemEventList = new ArrayList();

        /**
         * 브라우져에서 현재 날짜의 월을 받아와 그 월의 마지막 날짜를 받아온다.
         */
        int lastDay = Integer.parseInt(request.getParameter("lastDay"));

        int day = 0;
        int sum = 0;
        String itemId = "";


        String tempItemId = "";
        int tempItemCount = 0;

        List<String> tempIdList = new ArrayList<String>();

        /**
         * 아이템 ID 갯수 구하기
         */
        for(int j = 0; j < itemEventList.size(); j++){
            ItemEvent tempIE = new ItemEvent();
            tempIE = (ItemEvent)itemEventList.get(j);

            /**
             * temp 아이템 ID 와 tempItemEventList 에서 꺼낸 ID 가 다르면 itemCount 증가
             */
            if(tempItemId.equals(tempIE.getMyhistory_items_id_myhistory_items())){

            }else{
                tempItemCount = tempItemCount + 1;
                tempItemId = tempIE.getMyhistory_items_id_myhistory_items();
                tempIdList.add(tempItemId);
            }
        }

        int idx     = 0;
        int idx2    = -1;
        /**
         * 미리 비어있는 리스트를 생성.
         */
        for(int i = 0; i < tempIdList.size(); i++){
            /**
             * 1일에서 ~ 마지막날짜까지 반복.
             */
            for(day = 0; day < lastDay; day++){
                ItemEvent tie = new ItemEvent();
                tie.setAmount("0");
                tempItemEventList.add(tie);
            }
        }

        String strDay = "";
        String strItem = "";
        int index = 0;

        /**
         * 아이템 개수 만큼 반복
         */
        for(int i = 0; i < tempIdList.size(); i++){
            strItem = tempIdList.get(i);
            /**
             * 1일에서 ~ 마지막날짜까지 반복.
             */
            for(day = 0; day < lastDay; day++){

                if(day+1 < 10){
                    strDay = "0" + (day+1);
                }else{
                    strDay = Integer.toString(day+1);
                }

                for(int j = 0; j < itemEventList.size(); j++){
                    ItemEvent ie = new ItemEvent();



                    ie = (ItemEvent)itemEventList.get(j);

                    if(strItem.equals(ie.getMyhistory_items_id_myhistory_items()) //과목과 일치
                            & request.getParameter("date").equals(ie.getRegister_date().substring(0, 7)) //현재 년월과 일치
                            & strDay.equals(ie.getRegister_date().substring(8, 10))){ // 날짜가 일치

//                        logger.info("**아이템 년월 날짜가 일치**");
//                        logger.info("아이템 : {}", strItem);
//                        logger.info("년월   : {}", ie.getRegister_date().substring(0, 7));
//                        logger.info("일자   : {}", ie.getRegister_date().substring(8, 10));

                        ItemEvent tempItem = (ItemEvent)tempItemEventList.get(index);

                        ItemEvent saveIE = new ItemEvent();

                        saveIE.setModify_date(strDay);
                        saveIE.setMyhistory_items_id_myhistory_items(strItem);


                        saveIE.setAmount(Integer.toString(Integer.parseInt(tempItem.getAmount()) + Integer.parseInt(ie.getAmount())));

//                        logger.info("합계   : {}", saveIE.getAmount());

                        tempItemEventList.set(index, saveIE);

                    }
                }
                index++;
            }
//            logger.info("**아이템 항목 끝**");
        }

        /* 임시 아이템 리스트에 잘 들어갔는지 검사

        for(int j = 0; j < tempItemEventList.size(); j++){
            ItemEvent a = new ItemEvent();

            a = (ItemEvent)tempItemEventList.get(j);
            if(a.getAmount().equals("0")){

            }else{
                logger.info("***** itemEventList *****");
                logger.info("index    : {}", j);
                logger.info("날짜     : {}", a.getRegister_date());
                logger.info("아이템id : {}", a.getMyhistory_items_id_myhistory_items());
                logger.info("Amount   : {}", a.getAmount());
            }
        }
        */

        /**
         * 이벤트에 등록된 아이템 들의 이름을 리스트로 저장
         */
        for(int s = 0; s < tempIdList.size(); s++){
            Item tempItem = new Item();
            tempItem = (Item)myPageService.getItemByItemId(tempIdList.get(s));

            tempIdList.set(s, tempItem.getName());
        }





        ModelAndView mav = new ModelAndView();

        mav.setViewName("myPageContent");

        mav.addObject("categoryList", categoryList);
        mav.addObject("totalCount", Integer.parseInt(totalCount));
        mav.addObject("totalItemCount", totalItemCount);
        mav.addObject("totalFavorite", totalFavorite);

        mav.addObject("itemList", itemList);
        mav.addObject("itemCount", itemCount);

        mav.addObject("categoryId", NameCategory.getId_myhistory_categories());
        mav.addObject("name", NameCategory.getName());

        mav.addObject("itemEventList", tempItemEventList);
        mav.addObject("itemEventCount", tempItemEventList.size());
//        logger.info("itemEventCount : {}", tempItemEventList.size());

        mav.addObject("itemIdList", tempIdList);
        mav.addObject("itemIdListCount", tempIdList.size());
//        logger.info("itemIdListCount : {}", tempIdList.size());

        int tempDate = Integer.parseInt(request.getParameter("date").substring(5, 7));

//        logger.info("tempDate : {}", tempDate);
        mav.addObject("date", tempDate);


        mav.addObject("lastDay", lastDay);

        mav.addObject("mileage", member.getMileage());

        return mav;
    }



    ///////////////////////////////////////
    // Spring Framework Setter Injection //
    ///////////////////////////////////////

    private DayveService dayveService;
    private LocaleResolver localeResolver;
    private MyPageService myPageService;

    public void setLocaleResolver(LocaleResolver localeResolver) {
        this.localeResolver = localeResolver;
    }

    public void setDayveService(DayveService dayveService) {
        this.dayveService = dayveService;
    }

    public void setMyPageService(MyPageService myPageService) {
        this.myPageService = myPageService;
    }
}
